package utils;


import com.yangjicong.o2o.studey.base.common.exception.BusinessException;
import emun.ToolErrorCode;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * BigDecimal工具类
 * <p>
 *     1.加法
 *     2.减法
 *     3.乘法
 *     4.除法 - 6个方法
 * </p>
 * @author by yangjicong;
 * @date 2022/2/8.
 */
@Slf4j
public class BigDecimalUtil {

    private BigDecimalUtil(){}
    /**
     * 加法
     */

    public static BigDecimal add(String add1, String add2) {
        BigDecimal b1 = new BigDecimal(add1);
        BigDecimal b2 = new BigDecimal(add2);
        BigDecimal bigDecimal = b1.add(b2);
        return bigDecimal;
    }

    /**
     * 减法
     */
    public static BigDecimal sub(String sub1, String sub2) {
        BigDecimal b1 = new BigDecimal(sub1);
        BigDecimal b2 = new BigDecimal(sub2);
        BigDecimal bigDecimal = b1.subtract(b2);
        return bigDecimal;
    }
    /**
     * 减法
     */
    public static BigDecimal sub(Long sub1, Long sub2) {
        BigDecimal b1 = new BigDecimal(sub1);
        BigDecimal b2 = new BigDecimal(sub2);
        BigDecimal bigDecimal = b1.subtract(b2);
        return bigDecimal;
    }

    /**
     * 乘法
     */

    public static BigDecimal mul(String mul1, String mul2) {
        BigDecimal b1 = new BigDecimal(mul1);
        BigDecimal b2 = new BigDecimal(mul2);
        BigDecimal bigDecimal = b1.multiply(b2);
        return bigDecimal;
    }
    public static BigDecimal mul(Long mul1, Long mul2) {
        BigDecimal b1 = new BigDecimal(mul1);
        BigDecimal b2 = new BigDecimal(mul2);
        BigDecimal bigDecimal = b1.multiply(b2);
        return bigDecimal;
    }
    public static BigDecimal mul(BigDecimal mul1, Long mul2) {
        BigDecimal b2 = new BigDecimal(mul2);
        BigDecimal bigDecimal = mul1.multiply(b2);
        return bigDecimal;
    }

    /**
     * 除法
     *
     * @param diVi  被除数
     * @param diVid 除数
     * @param sur   保留几位小数
     * @return
     */
    public static String divide(long diVi, long diVid, int sur) {
        if (diVid <= 0) {
            throw new BusinessException(ToolErrorCode.SYSTEM_INNER_ERROR.getCode(),
                    ToolErrorCode.SYSTEM_INNER_ERROR.getDesc());
        }
        BigDecimal b1 = new BigDecimal(diVi);
        BigDecimal b2 = new BigDecimal(diVid);
        BigDecimal bigDecimal = b1.divide(b2, sur, RoundingMode.HALF_UP);
        return String.valueOf(bigDecimal);
    }
    /**
     * 除法
     *
     * @param diVi  被除数
     * @param diVid 除数
     * @return
     */
    public static Long divide(long diVi, long diVid) {
        if (diVid <= 0) {
            throw new BusinessException(ToolErrorCode.SYSTEM_INNER_ERROR.getCode(),
                    ToolErrorCode.SYSTEM_INNER_ERROR.getDesc());
        }
        BigDecimal b1 = new BigDecimal(diVi);
        BigDecimal b2 = new BigDecimal(diVid);
        BigDecimal bigDecimal = b1.divide(b2, 2, RoundingMode.HALF_UP);
        return bigDecimal.longValue();
    }
    /**
     * 除法,保留两位小数
     *
     * @param diVi  被除数
     * @param diVid 除数
     * @return
     */
    public static String divide(BigDecimal diVi, long diVid) {
        if (diVid <= 0) {
            throw new BusinessException(ToolErrorCode.SYSTEM_INNER_ERROR.getCode(),
                    ToolErrorCode.SYSTEM_INNER_ERROR.getDesc());
        }
        BigDecimal b2 = new BigDecimal(diVid);
        BigDecimal bigDecimal = diVi.divide(b2, 2, RoundingMode.HALF_UP);
        return String.valueOf(bigDecimal);
    }
    /**
     * 除法,保留两位小数
     *
     * @param diVi  被除数
     * @param diVid 除数
     * @return
     */
    public static BigDecimal divide(BigDecimal diVi, long diVid,int sur) {
        if (diVid <= 0) {
            throw new BusinessException(ToolErrorCode.SYSTEM_INNER_ERROR.getCode(),
                    ToolErrorCode.SYSTEM_INNER_ERROR.getDesc());
        }
        BigDecimal b2 = new BigDecimal(diVid);
        BigDecimal bigDecimal = diVi.divide(b2, sur, RoundingMode.HALF_UP);
        return bigDecimal;
    }
    /**
     * 除法,保留两位小数
     *
     * @param diVi  被除数
     * @param diVid 除数
     * @return
     */
    public static BigDecimal divide(String diVi, long diVid,int sur) {
        if (diVid <= 0) {
            throw new BusinessException(ToolErrorCode.SYSTEM_INNER_ERROR.getCode(),
                    ToolErrorCode.SYSTEM_INNER_ERROR.getDesc());
        }
        BigDecimal s = new BigDecimal(diVi);
        BigDecimal b2 = new BigDecimal(diVid);
        BigDecimal bigDecimal = s.divide(b2, sur, RoundingMode.HALF_UP);
        return bigDecimal;
    }
    /**
     * 除法
     *
     * @param diVi  被除数
     * @param diVid 除数
     * @param sur   保留几位小数
     * @return
     */
    public static BigDecimal divide(String diVi, String diVid, int sur) {
        BigDecimal b1 = new BigDecimal(diVi);
        BigDecimal b2 = new BigDecimal(diVid);
        return b1.divide(b2, sur, RoundingMode.HALF_UP);
    }
}
